/** 
* @author : 褚国强
* @date 创建时间：2022年1月25日 下午4:49:34 
* @version 1.0
*/
package com.bsoft.project.utils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.bsoft.project.controller.RsfComlfsServiceController;
import com.bsoft.project.mapper.RsfComlfsServiceMapper;
import com.bsoft.project.model.ZfblVoExcela;

/** 
* @author : 褚国强
* @date 创建时间：2022年1月25日 下午4:49:34 
* @Description: TODO
* @version 1.0 
* @parameter 
* @since 
* @return 
*/
public class ZfblExcelListener extends AnalysisEventListener<ZfblVoExcela>  {
	private final Logger logger = LoggerFactory.getLogger(RsfComlfsServiceController.class);
	
	private static int count = 0;
	
	// 由于每次读都是新new ExcelListener的，所以这个list不会存在线程安全问题
	List<ZfblVoExcela> list = new ArrayList<>();
	
	public RsfComlfsServiceMapper rsfComlfsServiceMapper;
    public ZfblExcelListener() {}
    public ZfblExcelListener(RsfComlfsServiceMapper rsfComlfsServiceMapper,String MLLX) {
        this.rsfComlfsServiceMapper = rsfComlfsServiceMapper;
        ZfblExcelListener.count = 0;
    }

	// 这个组件是Spring中的组件，这边推荐两种方法注入这个组件
	// 第一种就是提供一个UserInfoDataListener的构造方法，这个方法提供一个参数是UserInfoDataListener类型
	// 另外一种方法就是将 UserInfoDataListener 这个类定义成 UserService 实现类的内部类（推荐这种方式）
	// private UserService userService;

	@Override
	public void invoke(ZfblVoExcela data, AnalysisContext analysisContext) {		
		data.setSelfpay_prop_psn_type(data.getSelfpay_prop_psn_type().split("-")[0]);
		saveData(data);
		count++;
	}
	
	  //读取表头内容
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
    	logger.info("表头："+headMap);
    }

	@Override
	public void doAfterAllAnalysed(AnalysisContext analysisContext) {
		// 这里也要保存数据，确保最后遗留的数据也存储到数据库
		logger.info(count + "所有数据解析完成！");
	}

	private void saveData(ZfblVoExcela data) {
		// 保存数据
		try{
			rsfComlfsServiceMapper.insertUpdateZfblExcel(data);
		}catch(Exception e){
			logger.info(e.getMessage(), e);
			logger.info(count + " 行出错！");
			logger.info("解析到一条数据:{}", JSON.toJSONString(data));
		}
		if(count%1000 == 0){
			logger.info(count + " 解析完成！");
		}
	}
	
}

